//
// Created by DengLibin on 2018/12/8 0008.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
/**
 *文件操作 windows下 mingw环境
 **/
/**
用函数access，头文件是io.h，原型：

int   access(const   char   *filename,   int   amode);

amode参数为0时表示检查文件的存在性，如果文件存在，返回0，不存在，返回-1。

这个函数还可以检查其它文件属性：

06     检查读写权限
04     检查读权限
02     检查写权限
01     检查执行权限
00     检查文件的存在性



    文件操作：
    fgetc和fputc函数：读写一个字符
    fgets和fputs函数:读写一个字符串
    fscanf和fprintf：格式化读写 (新的标准用 fprintf_s)
    fwrite和fread是以记录为单位的I/O函数，fread和fwrite函数一般用于二进制文件的输入输出
    "r":只读
    "w":只写
    "a":打开后指向文件末尾,可追加
    "rb":打开二进制文件,只读
    "wb":打开二进制文件,只写
    "ab":打开二进制文件,追加
    "r+":以读/写方式打开一个已存在的文件
    "w+":以读写建立一个新的文件
    "a+":为读写打开一个文本文件进行追加
    "rb+"为读写打开一个二进制文件
    "wb+":为读写新建一个二进制文件
    "ab+":为读写打开一个二进制文件进行追加
*/

//写的方式打开文件
FILE *openWriteFile(char *filePath, int append) //文件路径 是否追加
{

    FILE *f = fopen(filePath, append ? "a" : "w");
    return f;
}
//读的方式打开文件
FILE *openReadFile(char *filePath)
{
    return fopen(filePath, "r");
}
// puts写入字符串
void putsLine(FILE *pFile, char *s)
{
    fputs(s, pFile);
}

//换行
void newLine(FILE *pFile)
{
    fputs("\n", pFile); //换行
}
//读一行
int getsLine(FILE *pFile, char *buf, int bufSize)
{
    //判读是否到文件末尾
    if (!feof(pFile))
    {
        fgets(buf, bufSize, pFile); //后面的换行符也会读进来
        return 0;
    }
    else
    {
        return -1;
    }
}
//复制文件(不用缓冲区)
void copyFile(char *srcFilePath, char *destFilePath)
{

    FILE *srcFile;                      //源文件指针
    FILE *destFile;                     //目标文件指针
    srcFile = fopen(srcFilePath, "rb"); //读取二进制文件

    destFile = fopen(destFilePath, "wb+"); //写入二进制文件(没有就新建)

    int c = 0;
    int i = 0;
    // time_t start = time(0); //只能精确到秒

    //从源文件读取字节
    while ((c = fgetc(srcFile)) != EOF)
    {
        i++;
        //写入字节到目标文件
        fputc(c, destFile);
    }
    // time_t end = time(0);

    printf("字节数:%d\n", i);
    printf("字节数:%d\n", i);
    fclose(destFile);
    fclose(srcFile);
}
//复制文件(用缓冲区)
void copyFileByBuf(char *srcFilePath, char *destFilePath)
{

    FILE *srcFile;
    FILE *destFile;

    srcFile = fopen(srcFilePath, "rb"); //读取二进制文件

    destFile = fopen(destFilePath, "wb+"); //写入二进制文件

    //缓冲区
    char *buf = (char *)calloc(1024, sizeof(char));
    unsigned int i = 0; //每次循环读取的字节数
    int sum = 0;        //字节总数

    //将字节读入缓冲区
    while (!feof(srcFile))
    {
        i = fread(buf, sizeof(char), 1024, srcFile);
        fwrite(buf, sizeof(char), i, destFile); //将缓冲区的内容写入到文件
        memset(buf, sizeof(char), 1024);        //清空缓冲区
        sum += i;                               //统计读取的字节数
    }

    printf("字节数:%d\n", sum);

    free(buf);       //释放分配的堆内存
    fclose(srcFile); //关闭文件
    fclose(destFile);
}

int main10()
{
    // openWriteFile("f:\\demo.txt",0);
    copyFileByBuf("C:\\Users\\DengLibin\\Desktop\\20091713417344_2.jpg",
                  "C:\\Users\\DengLibin\\Desktop\\123.jpg");
    return 0;
}